////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-2017 Qualcomm Technologies, Inc.
// All Rights Reserved.
// Confidential and Proprietary - Qualcomm Technologies, Inc.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @file  camxhwfactory.h
/// @brief HwFactory class declaration
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#ifndef CAMXHWFACTORY_H
#define CAMXHWFACTORY_H

#include "camxdefs.h"
#include "camxsettingsmanager.h"
#include "camxtypes.h"

CAMX_NAMESPACE_BEGIN

/// Forward Declarations
class  HwFactory;
class  Node;
struct NodeCreateInputData;
struct NodeCreateOutputData;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// @brief Class that implements the factory to create HW dependent object hierarchies.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
class HwFactory
{
public:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// Destroy
    ///
    /// @brief  Destroy the hw factory object.
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    VOID Destroy();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateNode
    ///
    /// @brief  Calls the HWL to create the concrete types node object.
    ///
    /// @param  pCreateInputData  Node create input data
    /// @param  pCreateOutputData Node create output data
    ///
    /// @return The HW Node as the base node object.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    Node* CreateNode(
        const NodeCreateInputData* pCreateInputData,
        NodeCreateOutputData*      pCreateOutputData
    ) const;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// CreateSettingsManager
    ///
    /// @brief  Calls the HWL to create the hardware-specific settings manager object.
    ///
    /// @return The hardware-specific settings manager object as a hardware-independent (base class) settings manager pointer.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    SettingsManager* CreateSettingsManager() const;

protected:
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwCreateNode
    ///
    /// @brief  Virtual function that is supposed to be implemented to create the concrete typed node object.
    ///
    /// @param  pCreateInputData  Node create input data
    /// @param  pCreateOutputData Node create output data
    ///
    /// @return Returns a pointer to the node object if successful, NULL otherwise
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual Node* HwCreateNode(
        const NodeCreateInputData* pCreateInputData,
        NodeCreateOutputData*      pCreateOutputData
        ) const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwCreateSettingsManager
    ///
    /// @brief  Virtual function to be overridden by the HWL factory to create the hardware-specific settings manager.
    ///
    /// @return The hardware-specific settings manager object as a hardware-independent (base class) settings manager pointer.
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual SettingsManager* HwCreateSettingsManager() const = 0;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// ~HwFactory
    ///
    /// @brief  Destructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    virtual ~HwFactory();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /// HwFactory
    ///
    /// @brief  Constructor
    ///
    /// @return None
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    HwFactory();

private:
    HwFactory(const HwFactory&) = delete;             ///< Disallow the copy constructor.
    HwFactory& operator=(const HwFactory&) = delete;  ///< Disallow assignment operator.
};

CAMX_NAMESPACE_END

#endif // CAMXHWFACTORY_H
